#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    //创建套接
    int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //地址域信息，套接字类型，套接字类型使用的协议
    if(sockfd < 0) //socket返回的是套接字描述符，即文件描述符。文件描述符不能小于0
    {
        perror("socket");
        return 0;
    }

    //客户端不需要绑定地址信息
    //首先需要创建协议所用的地址信息结构体
    struct sockaddr_in addr; //IPV4使用的是 struct sockaddr_in 这个结构体
    addr.sin_family = AF_INET; //地址域信息
    addr.sin_port = htons(45678); //端口，要把这个端口转换成为网络字节序
    addr.sin_addr.s_addr = inet_addr("82.157.94.99"); //IP地址转换为unit32_t，再转换为网络字节序
   
    int ret = connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));//connect接收的是服务端的地址信息结构
    if(ret < 0)
    {
        perror("connect");
        return 0;
        //continue; //如果连接失败也可以继续连接
    }

    while(1)
    {
        //发送
        char buf[1024] = "i am client222";

        int send_size = send(sockfd, buf, strlen(buf), 0);
        if(send_size <= 0)
        {
            perror("send"); 
            continue;             
        }
        else                                            {
            printf("发送的字节数是：%zu\n", send_size); //ssize_t 用 %zu 输出

    }
        //接收
        memset(buf, '\0', sizeof(buf)); //接收之前先初始化buf,否则会覆盖初始化之前buf里的内容。比如接收到123，就会覆盖i a，变成123m client111

        ssize_t recv_size = recv(sockfd, buf, sizeof(buf) - 1, 0);
        //发送和接收最后一位参数都是标志位，0表示阻塞发送或接收
        if(recv_size < 0)
        {
            perror("recv");
            continue;
        }
        else if(recv_size == 0)
        {
            printf("peer close connect\n");
            close(sockfd);
            continue;
        }

        printf("%s\n", buf);

        sleep(1); //每隔一秒发一次
    }

    close(sockfd);
    return 0;
}
